﻿/**
 * 为继承了 Ext.panel.Table 的类型掺入一些功能。
 */
Ext.define('Happy.table.mixin.List', {
    requires: [
        'Happy.override.view.Table',
        'Happy.table.action.Refresh',
        'Happy.table.action.New',
        'Happy.table.action.Edit',
        'Happy.table.plugin.AutoEnableAndDisableChildren'
    ],

    /**
     * 配置默认插件。
     *
     * protect
     */
    configDefaultPlugins: function () {
        var me = this;

        me.plugins = me.plugins || [];

        me.plugins.push(
            'auto-enable-and-disable-children'
        );
    },

    /**
     * 先取消选择，再重新选择，主要解决调用 store.loadData() 后调用 
     * getFirstSelected() 返回的是之前的记录。
     * 
     * @return {Ext.data.Model}
     */
    reselect: function () {
        var me = this;

        var record = me.getFirstSelected();
        if (!record) {
            return;
        }

        me.getSelectionModel().deselectAll();

        record = me.getStore().getById(record.getId());
        if (!record) {
            return;
        }

        me.getSelectionModel().select([record]);
    },

    /**
     * 选中并返回记录。
     * 
     * @return {Ext.data.Model}
     */
    selectAndReturnRecord: function (id) {
        var me = this;

        var record = me.getStore().getById(id);
        me.getSelectionModel().select([record]);

        return record;
    },

    /**
     * 返回选中的第一条记录。
     * 
     * @return {Ext.data.Model}
     */
    getFirstSelected: function () {
        var me = this;

        var selected = me.getSelectionModel().getSelection();

        if (selected.length == 0) {
            return null;
        }

        return selected[0];
    },

    /**
     * 返回选中的所有记录。
     * 
     * @return {Array}
     */
    getSelection: function () {
        var me = this;

        return me.getSelectionModel().getSelection();
    },

    /**
     * 刷新表格。
     * 
     * @param {Object} option Ext.data.Store.load() 可以接受的配置对象
     */
    refresh: function (option) {
        var me = this;

        me.getStore().load(option);
    },

    /**
     * 配置组件。
     * 
     * @protected
     */
    configComponent: function () {
        var me = this;

        me.configTbar();
        me.configColumns();
        me.configStore();
    },

    /**
     * 配置工具栏。
     * 
     * @protected
     */
    configTbar: function () {
        var me = this;

        me.tbar = me.tbar || [];
    },

    /**
     * 配置列。
     * 
     * @protected
     */
    configColumns: function () {
        var me = this;

        me.columns = me.columns || [];
    },

    /**
     * 配置仓储。
     * 
     * @protected
     */
    configStore: function () {
        var me = this;

        if (me.store) {
            return;
        }
        else {
            me.store = Ext.create(me.storeConfig.type, me.storeConfig || {});
        }
    },

    /**
     * 创建记录。
     *
     * {@link Happy.table.action.New} 会用此方法的返回值绑定表单。
     * 一般的表格实现，不需要用到第一个参数，但是树形表格就需要用到第一个参数了（代表了父亲记录）。
     *
     * @param {Ext.data.Model} record 选中的第一条记录
     * @return {Ext.data.Model}
     */
    createRecord: Ext.emptyFn,

    /**
     * 添加记录。
     *
     * {@link Happy.form.action.Save} 会调用此方法添加表单绑定的记录。
     * 
     * @param {Ext.data.Model} record
     */
    insertRecord: Ext.emptyFn,

    /**
     * 修改记录。
     *
     * {@link Happy.form.action.Save} 会调用此方法修改表单绑定的记录。
     * 
     * @param {Ext.data.Model} record
     */
    updateRecord: Ext.emptyFn
});